package saei.persistencia.DAO;

import java.util.List;

import org.hibernate.Query;

import saei.bean.Cpu;
import saei.bean.Equipo;
import saei.bean.Estado;
import saei.bean.Impresora;
import saei.bean.Monitor;
import saei.bean.Ups;
import saei.service.ServiciosEstado;


@SuppressWarnings({"rawtypes","unchecked"})
public class EquipoDAO extends EntidadPersistenteDAO{
	
	public static Equipo buscarEquipo(String numeroSerie) {
		return (Equipo) buscarEquipo(Equipo.class, numeroSerie);
	}
	
	public static Cpu buscarCpu(String numeroSerie) {
		return (Cpu) buscarEquipo(Cpu.class, numeroSerie);
	}
	
	public static List<Cpu> buscarCpuActivas() {
		String fromQuery = "from Cpu where estado != :sinAsignar and estado != :baja";
		
		Query query = getSession().createQuery(fromQuery);	
		query.setEntity("sinAsignar", ServiciosEstado.EstadoSinAsignar());
		query.setEntity("baja", ServiciosEstado.EstadoBaja());
		
		return query.list();
	}
	
	public static Monitor buscarMonitor(String numeroSerie) {
		return (Monitor) buscarEquipo(Monitor.class, numeroSerie);
	}
	
	public static Impresora buscarImpresora(String numeroSerie) {
		return (Impresora) buscarEquipo(Impresora.class, numeroSerie);
	}
	
	public static Ups buscarUps(String numeroSerie) {
		return (Ups) buscarEquipo(Ups.class, numeroSerie);
	}
	
	public static List<Equipo> buscarTodos() {
		String fromQuery = "from Equipo";			
		Query query = getSession().createQuery(fromQuery);		
		return query.list();
	}
	
	private static Equipo buscarEquipo(Class tipo, String numeroSerie) {
		List lista = null;
		
		String fromQuery = "from " + tipo.getSimpleName() + " where numeroSerie = :numeroSerie";
		Query query = getSession().createQuery(fromQuery);
		query.setString("numeroSerie", numeroSerie);
		lista = query.list();
		
		return (Equipo) (lista != null && lista.size() > 0 ? lista.get(0) : null);
	}
	
	public static boolean existeEquipo(String numeroSerie) {
		List lista = null;
		
		String fromQuery = "select e.numeroSerie from Equipo e where e.numeroSerie = :numeroSerie";
		Query query = getSession().createQuery(fromQuery);
		query.setString("numeroSerie", numeroSerie);
		lista = query.list();
		
		return lista != null && lista.size() > 0 ? true : false;	
		
	}
	
	public static List<Equipo> buscarEquiposConEstado(Estado estado) {
		List lista = null;
		
		String fromQuery = " from Equipo where estado = :estado";
		Query query = getSession().createQuery(fromQuery);
		query.setEntity("estado", estado);
		lista = query.list();
		
		return lista;
	}
}
